import type { Router, LocationQueryRaw } from 'vue-router';
import NProgress from 'nprogress'; // progress bar

import usePermission from '@/hooks/usePermission';
import { useUserStore } from '@/stores';
import { isLogin } from '@/utils/token';
import appRoutes from '../routes';

export default function setupPermissionGuard(router: Router) {
  router.beforeEach(async (to, from, next) => {
    NProgress.start();
    const userStore = useUserStore();

    /**如果权限通过则放行，如果权限不通过则找到该用户可用的第一个路由然后前往该路由，如果该用户无路由则前往notFound */
    async function crossroads() {
      const Permission = usePermission();
      if (Permission.accessRouter(to)) next();
      else {
        const destination = Permission.findFirstPermissionRoute(
          appRoutes,
          userStore.computedUserInfo.role
        ) || {
          name: 'notFound',
        };
        next(destination);
      }
      NProgress.done();
    }

    if (isLogin()) { // 已经登录
      if (userStore.computedUserInfo.role) { //是否有用户信息
        crossroads();
      } else { // 还没有用户信息
        try {
          await userStore.info();
          crossroads();
        } catch (error) { // 获取用户信息失败则跳转到登录界面
          next({
            name: 'login',
            query: {
              redirect: to.name,
              ...to.query,
            } as LocationQueryRaw,
          });
          NProgress.done();
        }
      }
    } else { // 还没有登录
      if (to.name === 'login') { //如果本来就是要去登录
        next();
        NProgress.done();
        return;
      }

      // 如果本来不是去登录，则携带原本的参数跳转到登录，原本的参数在点击登录按钮触发的跳转函数那里就会被用上。
      next({
        name: 'login',
        query: {
          redirect: to.name,
          ...to.query,
        } as LocationQueryRaw,
      });
      NProgress.done();
    }
  });
}
